package com.itheima.tlias84.Intertceptor;

import com.alibaba.fastjson2.JSONObject;
import com.itheima.tlias84.entity.Emp;
import com.itheima.tlias84.mapper.EmpMapper;
import com.itheima.tlias84.utils.JwtUtil;
import com.itheima.tlias84.utils.ResultUtil;
import jakarta.annotation.Resource;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerAdapter;
import org.springframework.web.servlet.HandlerInterceptor;

import java.io.IOException;
import java.util.Objects;

/**
 * 登录拦截器 由spring提供
 * 和过滤器的区别
 * 1.过滤器（Filter）与拦截器（Interceptor）的区别
 * 相同点：执行都在Controller（servlet）之前
 * 不同点：技术提供方： 过滤器是servlet提供的  拦截器是spring提供的
 *
 *         执行顺序 ：是先执行过滤器 后执行拦截器
 *
 *         拦截力度 ：过滤器是拦截所有（粗） 编码转换，时间格式相同
 *         拦截器是拦截部分（细） 登录认证比较多，接口日志记录
 */
@Component
public class Longinlnterceptor  implements HandlerInterceptor {
    @Resource
    EmpMapper empMapper;

    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws IOException {
       // 放行登录接口
//        String requestURI = req.getRequestURI();
//        if (requestURI.contains("/login")){
//
//            return true;
//        }
        //获取请求头中的token
        String token = req.getHeader("token");
        //判断是否有token
        if(Objects.isNull(token)){
            writeErrorResponse(resp, "请先登录账号密码");
            return false;
        }
        //使用jwt验证 token 验证token合法性
        try {
            JSONObject jsonObject = JwtUtil.verifyToken(token);
            Emp emp = empMapper.selectEmpByUsername(jsonObject.getString("username"));
            if(Objects.isNull(emp)|| ! emp.getPassword().equals(jsonObject.getString("password"))) {
                writeErrorResponse( resp,"老老实实做人");
                return false;
            }
        }catch (Exception e){
            writeErrorResponse( resp,"Token已过期");
            return false;
        }
        return true;
    }

    private static void writeErrorResponse(HttpServletResponse servletResponse1, String msg) throws IOException {
        // 因为浏览器是UTF-8  如果不设置前端接受到的是？？？ 所以要设置UTF-8
        servletResponse1.setContentType("application/json;charset=UTF-8");
        servletResponse1.setCharacterEncoding("UTF-8");
        //设置响应状态码 加上这个必须要登录
        servletResponse1.setStatus(401);
        //因为前端是json格式的，所以这里要设置返回的格式为json 用JSONObject.toJSONString(fail)
        ResultUtil fail = ResultUtil.fail(msg);
        servletResponse1.getWriter().write(JSONObject.toJSONString(fail));
    }

}
